/***************************************************************************
 *   Copyright (C) 2007 by Kai Winter   *
 *   kaiwinter@gmx.de   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "linestring.h"
namespace qmapcontrol
{
	LineString::LineString()
	: Curve()
	{
		GeometryType = "LineString";
	}

	LineString::LineString(QList<Point*> const points, QString name, QPen* pen)
	:Curve(name)
	{
		mypen = pen;
		LineString();
		setPoints(points);
	
	//TODO: bremst stark
// 	pen.setStyle(Qt::DashDotDotLine);
	}

	LineString::~LineString()
	{
	}

// Geometry		LineString::Clone(){}

// Point LineString::EndPoint(){}
// Point LineString::StartPoint(){}
// Point LineString::Value(){}


	void 				LineString::addPoint(Point* point)
	{
		vertices.append(point);
	}

	QList<Point*>	LineString::points()
	{
		return vertices;
	}

	void				LineString::setPoints(QList<Point*> points)
	{
		for (int i=0; i<points.size(); i++)
		{
			points.at(i)->setParentGeometry(this);
		}
		vertices = points;
	}

	void LineString::draw(QPainter* painter, const MapAdapter* mapadapter, const QRect &screensize, const QPoint offset)
	{
		if (!visible)
			return;
	
		QPolygon p = QPolygon();
	
		QPointF c;
		for (int i=0; i<vertices.size(); i++)
		{
			c = vertices[i]->coordinate();
			p.append(mapadapter->coordinateToDisplay(c));
		}
		if (mypen != 0)
		{
			painter->save();
			painter->setPen(*mypen);
		}
		painter->drawPolyline(p);
		if (mypen != 0)
		{
			painter->restore();
		}
		for (int i=0; i<vertices.size(); i++)
		{
			vertices[i]->draw(painter, mapadapter, screensize, offset);
		}
	}

	int LineString::numberOfPoints() const
	{
		return vertices.count();
	}
	bool LineString::Touches(Point* geom, const MapAdapter* mapadapter)
	{
// 	qDebug() << "LineString::Touches Point";
		touchedPoints.clear();
		bool touches = false;
		for (int i=0; i<vertices.count(); i++)
		{
			// use implementation from Point
			if (vertices.at(i)->Touches(geom, mapadapter))
			{
				touchedPoints.append(vertices.at(i));
			
				touches = true;
			}
		}
		if (touches)
		{
			emit(geometryClicked(this, QPoint(0,0)));
		}
		return touches;
	}
	bool LineString::Touches(Geometry* /*geom*/, const MapAdapter* /*mapadapter*/)
	{
// 	qDebug() << "LineString::Touches Geom";
		touchedPoints.clear();
	
		return false;
	}

	QList<Geometry*> LineString::clickedPoints()
	{
		return touchedPoints;
	}
	bool LineString::hasPoints() const
	{
		return vertices.size() > 0 ? true : false;
	}
	bool LineString::hasClickedPoints() const
	{
		return touchedPoints.size() > 0 ? true : false;
	}

	QRectF	LineString::boundingBox()
	{
		qreal minlon=180;
		qreal maxlon=-180;
		qreal minlat=90;
		qreal maxlat=-90;
		for (int i=0; i<vertices.size(); i++)
		{
			Point* tmp = vertices.at(i);
			if (tmp->longitude() < minlon) minlon = tmp->longitude();
			if (tmp->longitude() > maxlon) maxlon = tmp->longitude();
			if (tmp->latitude() < minlat) minlat = tmp->latitude();
			if (tmp->latitude() > maxlat) maxlat = tmp->latitude();
		}
		QPointF min = QPointF(minlon, minlat);
		QPointF max = QPointF(maxlon, maxlat);
		QPointF dist = max - min;
		QSizeF si = QSizeF(dist.x(), dist.y());
	
		return QRectF(min, si);
	
	}
}
